package apresentacao;

import java.io.IOException;
import java.util.Scanner;

import excecoes.ContaException;
import excecoes.IPException;
import excecoes.PessoaException;
import excecoes.SistemaException;
import excecoes.UsuarioException;
import facade.Facade;

/**
 * Implementa uma interface texto simples.
 * 
 * @author Adalberto Teixeira
 * @author Andrey Menezes
 * @author Laise Florentino
 * @author Laio Francis
 * 
 */
public class Texto {
	static Facade sistema;
	static Scanner scan;

	public static void main(String[] args) {
		sistema = new Facade();
		scan = new Scanner(System.in);
		principal();
	}

	/**
	 * Menu principal do sistema.
	 */
	private static void principal() {
		String escolha;
		System.out.println("Seja bem-vindo ao I'm Here");
		System.out.println("");
		System.out.println("1 - Criar Usuario");
		System.out.println("2 - Login");
		System.out.println("3 - Remover Usuario");
		System.out.println("4 - Zerar Sistema");
		System.out.println("5 - Encerrar Sistema");
		System.out.println();
		System.out.print("Digite a opcao desejada: ");
		escolha = scan.next();
		try {
			int escolha2 = Integer.parseInt(escolha);
			switch (escolha2) {
			case (1):
				criarUsuario();
			case (2):
				login();
			case (3):
				System.out.println("Digite o userName do usuario que sera removido: ");
				String userName = scan.next();
				sistema.removerUsuario(userName);
			case (4):
				sistema.zerarSistema();
				System.out.println("Sistema zerado com sucesso.");
			case (5):
				sistema.encerrarSistema();
			default:
				System.err.println("Opcao Invalida.\n\n");
				principal();
			}
		} catch (Exception e) {
			System.err.println("Opcao Invalida.\n");
			principal();
		}

	}

	/**
	 * Menu de criacao de usuario.
	 */
	private static void criarUsuario() {
		try {
			System.out.println("CRIAR USUARIO");
			System.out.println("");
			System.out.print("UserName: ");
			String userName = scan.next();
			System.out.print("Nome: ");
			String nome = scan.next();
			System.out.print("Email: ");
			String email = scan.next();
			System.out.print("Senha: ");
			String senha = scan.next();
			System.out.print("Telefone: ");
			String telefone = scan.next();
			sistema.criarUsuario(userName, nome, email, senha, telefone);
			System.out.println("Voce esta cadastrado no I'm Here.");
			logado(userName);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}

	/**
	 * Menu de login de usuario.
	 */
	private static void login() {
		try {
			System.out.println("LOGIN");
			System.out.println("");
			System.out.print("UserName: ");
			String userName = scan.next();
			System.out.print("Senha: ");
			String senha = scan.next();
			System.out.print("IP: ");
			String ip = scan.next();
			sistema.login(userName, senha, ip);
			logado(userName);
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}

	/**
	 * Menu de servicos do usuario.
	 * @param usuario O usuario
	 */
	private static void logado(String usuario) {
		String escolha;
		System.out.println("VOCE ESTA LOGADO NO I'M HERE");
		System.out.println("");
		System.out.println("1 - Obter Localizacao");
		System.out.println("2 - Setar localizacao");
		System.out.println("3 - Iniciar Mensageiro");
		System.out.println("4 - Amigos");
		System.out.println("5 - Atualizar Dados");
		System.out.println("6 - Voltar para a Pagina Principal");
		System.out.println("Digite a opcao desejada: ");
		escolha = scan.next();
		try {
			int escolha2 = Integer.parseInt(escolha);
			switch (escolha2) {
			case (1):
				System.out.println(sistema.obterLocalizacao(usuario));
				logado(usuario);
			case (2):
				try {
					System.out.println("SETAR LOCALIZACAO");
					System.out.println("");
					System.out.print("Latitude: ");
					String latitude = scan.next();
					System.out.print("Longitude: ");
					String longitude = scan.next();
					sistema.setLocalizacao(usuario, latitude, longitude);
					System.out.println("Localizacao atualizada com sucesso.");
					logado(usuario);
				} catch (Exception e) {
					System.err.println(e.getMessage());
				}
			case (3):
				try {
					System.out.println("Qual o tipo de mensageiro?");
					System.out.println("1 - Email");
					System.out.println("2 - SMS");
					System.out.println("3 - Chat");
					String escolhaMensageiro = scan.next();
					int escolhaMensageiro2 = Integer
							.parseInt(escolhaMensageiro);
					mensageiro(usuario, escolhaMensageiro2);
				} catch (Exception e) {
					System.err.println("Dados Invalidos.");
					logado(usuario);
				}
			case (4):
				try {
					System.out.println("Opcoes:");
					System.out.println("1 - Convidar amigo");
					System.out.println("2 - Remover amigo");
					System.out.println("3 - Listar amigos");
					System.out.println("4 - Localizar amigo");
					System.out.println("5 - Voltar para a Pagina Principal");
					System.out.println("Digite a opcao desejada: ");
					String escolhaAmigo = scan.next();
					int escolhaAmigo2 = Integer.parseInt(escolhaAmigo);
					menuAmigos(usuario, escolhaAmigo2);
					
				} catch (Exception e) {
					System.err.println("Dados ou opcao invalida.");
					logado(usuario);
				}
			case (5):
				System.out.println("Qual dado deseja atualizar?");
				System.out.println("1 - Nome");
				System.out.println("2 - UserName");
				System.out.println("3 - Senha");
				System.out.println("4 - Email");
				System.out.println("5 - Telefone");
				System.out.println("6 - Voltar para a Pagina Principal");
				String escolhaAtualizar = scan.next();
				int escolhaAtualizar2 = Integer.parseInt(escolhaAtualizar);
				menuAtualizar(usuario, escolhaAtualizar2);
			case (6):
				principal();
			default:
				System.err.println("Opcao Invalida.\n\n");
				principal();
			}
		} catch (Exception e) {
			System.err.println("Opcao Invalida.\n");
			logado(usuario);
		}

	}

	/**
	 * Menu de atualizacao de dados do usuario.
	 * 
	 * @param usuario O usuario
	 * @param escolha A opcao
	 * 
	 * @throws UsuarioException
	 * @throws PessoaException
	 */
	private static void menuAtualizar(String usuario, int escolha) throws PessoaException, UsuarioException {
		switch (escolha) {
		case (1):
			try {
				System.out.println("Digite o novo nome: ");
				String nome = scan.next();
				sistema.atualizarUsuario(usuario, "nome", nome);
			} catch (ContaException e) {
				System.err.println("Dados invalidos.");
			} catch (IPException e) {
				e.printStackTrace();
			}
		case (2):
			try {
				System.out.println("Digite o novo UserName: ");
				String userName = scan.next();
				sistema.atualizarUsuario(usuario, "userName", userName);
			} catch (ContaException e) {
				System.err.println("Dados invalidos.");
			} catch (IPException e) {
				e.printStackTrace();
			}
		case (3):
			try {
				System.out.println("Digite a nova senha: ");
				String senha = scan.next();
				sistema.atualizarUsuario(usuario, "senha", senha);
			} catch (ContaException e) {
				System.err.println("Dados invalidos.");
			} catch (IPException e) {
				e.printStackTrace();
			}
		case (4):
			try {
				System.out.println("Digite o novo Email: ");
				String email = scan.next();
				sistema.atualizarUsuario(usuario, "email", email);
			} catch (ContaException e) {
				System.err.println("Dados invalidos.");
			} catch (IPException e) {
				e.printStackTrace();
			}
		case (5):
			try {
				System.out.println("Digite o novo telefone: ");
				String telefone = scan.next();
				sistema.atualizarUsuario(usuario, "telefone", telefone);
			} catch (ContaException e) {
				System.err.println("Dados invalidos.");
			} catch (IPException e) {
				e.printStackTrace();
			}
		case (6):
			logado(usuario);
		default:
			System.out.println("Opcao invalida.");
			logado(usuario);
		}
	}

	/**
	 * Menu de servicos de relacionamento com amigos.
	 * 
	 * @param usuario O usuario
	 * @param escolha A opcao
	 * 
	 * @throws IOException
	 */
	private static void menuAmigos(String usuario, int escolha) throws IOException {
		switch (escolha) {
		case (1):
			try {
				System.out.println("Para quem deseja enviar o convite?");
				String para = scan.next(); 
				sistema.enviarConvite(usuario, para);
			} catch (IOException e) {
				System.err.println("Remetente e/ou destinatario invalido.");
			}
		case (2):
			try {
				System.out.println("Qual amigo que deseja remover?");
				String remover = scan.next(); 
				sistema.removerAmigo(usuario, remover);
			} catch (ContaException e) {
				System.err.println("Usuario e/ou amigo invalido.");
			}
		case (3):
			try {
				System.out.println("Lista de amigos:");
				System.out.println(sistema.getAmigos(usuario));
			} catch (ContaException e) {

			}
		case (4):
			try {
				System.out.println("Qual amigo deseja ver localizacao?");
				String amigo = scan.next();
				sistema.getLocalizacaoAmigo(usuario, amigo);
			} catch (ContaException e) {
				System.err.println("Permissao negada.");
			} catch (SistemaException e) {
				System.err.println("Permissao negada.");
			}
		case (5):
			logado(usuario);
		default:
			System.out.println("Opcao invalida.");
			logado(usuario);
		}	
	}

	/**
	 * Menu de mensagem.
	 * 
	 * @param usuario O usuario
	 * @param escolha A opcao
	 */
	private static void mensageiro(String usuario, int escolha) {
		// Escolha: 1 - Email, 2 - SMS, 3 - Chat
		switch (escolha) {
		case (1):
			try {
				sistema.initMensageiro("email");
				System.out.println("ENVIAR EMAIL");
				System.out.println("");
				System.out.print("De: ");
				String de = scan.next();
				System.out.print("Para: ");
				String para = scan.next();
				System.out.println("Assunto: ");
				String assunto = scan.next();
				System.out.println("Mensagem: ");
				String msg = scan.next();
				sistema.enviarEmail(de, para, assunto, msg);
				System.out.println("Email enviado com sucesso");
			} catch (Exception e) {
				System.err.println(e.getMessage());
				logado(usuario);
			}
		case (2):
			try {
				sistema.initMensageiro("sms");
				System.out.println("ENVIAR SMS");
				System.out.println("");
				System.out.println("De: ");
				String de = scan.next();
				System.out.println("Para: ");
				String para = scan.next();
				System.out.println("Mensagem: ");
				String msg = scan.next();
				sistema.enviarSMS(de, para, msg);
				System.out.println("SMS enviado com secesso");
			} catch (Exception e) {
				System.err.println(e.getMessage());
				logado(usuario);
			}
		case (3):
			try {
				sistema.initMensageiro("chat");
				System.out.println("ABRIR CHAT");
				System.out.println("");
				System.out.print("Porta: ");
				String portaEntrada = scan.next();
				int porta = Integer.parseInt(portaEntrada);
				sistema.setPortChat(porta);
				System.out.print("Amigo: ");
				String amigo = scan.next();
				sistema.initChat(usuario, amigo);
				System.out.println("Chat iniciado com sucesso");
				chat(usuario, amigo);
			} catch (Exception e) {
				System.err.println(e.getMessage());
				logado(usuario);
			}
		default:
			System.err.println("Opcao invalida");
			logado(usuario);
		}
	}

	/**
	 * Menu do chat.
	 * 
	 * @param usuario O usuario
	 * @param amigo O amigo com quem o usuario ira conversar
	 */
	private static void chat(String usuario, String amigo) {
		try {
			System.out.println("CHAT COM: " + amigo);
			System.out.println("");
			System.out.println("1 - Enviar Mensagem");
			System.out.println("2 - Sair do Chat");
			String escolha = scan.next();
			int escolha2 = Integer.parseInt(escolha);
			switch (escolha2) {
			case (1):
				System.out.println("Mensagem: ");
				String msg = scan.next();
				sistema.enviarMensagem(amigo, msg);
				System.out.println("Mensagem enviada com sucesso");
			case (2):
				logado(usuario);
			}
		} catch (Exception e) {
			System.err.println(e.getMessage());
			chat(usuario, amigo);
		}
	}
}
